#include "commom.hpp"

// 信息读取函数
void GetMessage(int fd)
{
    char read_buffer[SIZE] = {0};    //读数据缓冲区

    while(true)
    {
        ssize_t n = read(fd, read_buffer, SIZE - 1);    //从管道文件读数据
        if(n > 0)
        {
            read_buffer[n] = '\0';
            std::cout << "[ " << getpid() << " ]  client say# " << read_buffer << std::endl;
        }
        else if(n == 0)
        {
            std::cout << "client quit, read end, serve quit too! " << std::endl;
            break;
        }
        else  // n < 0 -- 读取出错
        {
            perror("read");
            break;
        }
    }
}

//服务端代码
int main()
{
    // 1. 创建命名管道文件
    if(mkfifo(ipcPath.c_str(), MODE) < 0)
    {
        perror("mkfifo");
        exit(1);
    }

    log("管道创建成功", DEBUG);

    // 2. 服务端以只读方式打开文件
    int fd = open(ipcPath.c_str(), O_RDONLY);
    if(fd < 0)  //检验打开是否成功
    {
        perror("serve fopen");
        exit(2);
    }

    log("文件打开成功", DEBUG);

    // 3. 创建子进程，进行进程间通信（读数据）
    for(int i = 0; i < PROCESS_NUM; ++i)
    {
        pid_t id = fork();
        if(id == 0)   //子进程代码
        {
            GetMessage(fd);   //信息读取函数
            exit(0);
        }
    }

    // 4. 阻塞等待子进程退出
    for(int i = 0; i < PROCESS_NUM; ++i)
    {
        waitpid(-1, NULL, 0);
    }

    log("子进程全部退出", NOTICE);

    // 5. 关闭文件，删除命名管道文件
    close(fd);
    unlink(ipcPath.c_str());

    log("文件关闭成功", NOTICE);
    // std::cout << "文件关闭成功" << std::endl;

    return 0;
}